#include <my_header.h>

/* Usage: ./6_myls_al pathname */
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    DIR *dirp = opendir(argv[1]);
    ERROR_CHECK(dirp, NULL, "opendir");

    // 切换工作目录为参数传入的目录
    int ret = chdir(argv[1]);
    ERROR_CHECK(ret, -1, "chdir");

    // dirent结构体指针，用于存放目录信息
    struct dirent *pdirent;
    // 读取目录中的每个目录项
    while((pdirent = readdir(dirp)) != NULL)
    {
        // 第一种方式拼接
        // 拼接文件路径，如果上面没有chdir切换目录，这里就需要做绝对路径的拼接操作
        // char path[1024] = {0};
        // sprintf(path, "%s%s%s", argv[1], "/", pdirent->d_name);
        // 或者也可以用strcpy以及strcat函数进行复制拼接获取最终目录
        // strcpy(path, argv[1]);
        // strcat(path, "/");
        // strcat(path, pdirent->d_name);
        
        // 第二种使用结构体指针
        // 获取文件相关的信息
        struct stat stat_buf;
        // 由于切换了工作目录，所以文件名就是路径名。
        // 如果没有切换，那么这里需要传参path
        int ret = stat(pdirent->d_name, &stat_buf);
        ERROR_CHECK(ret, -1, "stat");

        // 输出文件相关的信息
        printf("%o %lu %u %u %lu %lu %s \n",
                stat_buf.st_mode,    // 以八进制无符号输出，
                                     // 可以看到权限的数字表示法
               stat_buf.st_nlink,    // 无符号长整型输出 
               stat_buf.st_uid,     // 无符号int输出
               stat_buf.st_gid,     // 无符号int输出
               stat_buf.st_size,    // 无符号长整型输出 
               stat_buf.st_mtim.tv_sec, // 时间戳打印秒数，以无符号长
                                        // 整型打印。这里还可以写statbuf.st_mtimie
               pdirent->d_name);    // 字符串打印
    }
    // 关闭文件目录流
    closedir(dirp);
    return 0;
}

/*
 *stat函数调用时需要传入的两个参数就可以了：

1. 第一个参数必须是文件的路径名，而文件名并不一定直接就是路径名。
2. 第二个参数必须是一个已申请内存的stat结构体指针，整个stat函
数相当于给stat结构体对象初始化。
 *
 *
 */
